package com.ywyself.dao;

import java.util.Date;

import com.jfinal.kit.Kv;
import com.jfinal.kit.LogKit;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Page;
import com.jfinal.plugin.activerecord.Record;
import com.jfinal.plugin.activerecord.SqlPara;
import com.ywyself.ext.kit.YsKit;
import com.ywyself.ext.utils.YsDateUtils;
import com.ywyself.model.Article;

public class ArticleDao {

	/**
	 * 表名
	 */
	private static final String TABLE_NAME = "ys_article";

	/**
	 * 添加文章
	 * 
	 * @param article
	 *            文章
	 * @return true|数据插入成功
	 */
	public YsKit save(Article article) {
		try {
			Date d = new Date();
			article.setAddTime(d);
			article.setUpdateTime(d);
			boolean isOk = Db.save(TABLE_NAME, article.toRecord());
			if (isOk) {
				return YsKit.ok().msg("保存成功");
			} else {
				return YsKit.fail().msg("保存失败");
			}
		} catch (Exception e) {
			LogKit.error("ArticleDao.save():" + e.getLocalizedMessage());
			return YsKit.sqlError();
		}
	}

	/**
	 * 根据id查找文章
	 * 
	 * @param id
	 *            文章id
	 * @return 文章模型
	 */
	public Article get(long id) {
		return Article.dao.findById(id);
	}

	/**
	 * 删除文章
	 * 
	 * @param id
	 *            文章的id
	 * @return true|删除成功
	 */
	public YsKit delete(long id) {
		try {
			boolean isOk = Db.deleteById(TABLE_NAME, id);
			if (isOk) {
				return YsKit.ok().msg("删除成功");
			} else {
				return YsKit.fail().msg("删除失败");
			}
		} catch (Exception e) {
			LogKit.error("ArticleDao.delete():" + e.getLocalizedMessage());
			return YsKit.sqlError();
		}
	}

	/**
	 * 更新文章
	 * 
	 * @param article
	 *            新的文章内容
	 * @return true|更新成功
	 */
	public YsKit update(Article article) {
		try {
			article.setUpdateTime(new Date());
			boolean isOk = Db.update(TABLE_NAME, article.toRecord());
			if (isOk) {
				return YsKit.ok().msg("更新成功");
			} else {
				return YsKit.fail().msg("更新失败");
			}
		} catch (Exception e) {
			LogKit.error("ArticleDao.update():" + e.getLocalizedMessage());
			return YsKit.sqlError();
		}
	}

	/**
	 * 置顶/取消置顶文章
	 * 
	 * @param aid
	 *            文章的id
	 * @param isTop
	 *            是否置顶
	 * @return
	 */
	public YsKit updateIsTop(long aid, int isTop) {
		return this.updateColumnsById(aid, Kv.by("is_top", isTop).set("update_time", YsDateUtils.getStr()));
	}

	/**
	 * 修改文章的摘要
	 * 
	 * @param id
	 *            文章的id
	 * @param summary
	 *            摘要
	 * @return true|修改成功
	 */
	public YsKit updateSummary(long aid, String summary) {
		return this.updateColumnsById(aid, Kv.by("summary", summary).set("update_time", YsDateUtils.getStr()));
	}

	/**
	 * 更新文章的seo信息
	 * 
	 * @param id
	 *            文章的id
	 * @param keywords
	 *            关键字
	 * @param description
	 *            关键字描述
	 * @return
	 */
	public YsKit updateSEO(long aid, String keywords, String description) {
		return this.updateColumnsById(aid, Kv.by("meta_keywords", keywords).set("meta_description", description)
				.set("update_time", YsDateUtils.getStr()));
	}

	/**
	 * 更新文章的内容
	 * 
	 * @param aid
	 *            文章id
	 * @param data
	 *            待修改的内容
	 * @return
	 */
	private YsKit updateColumnsById(long aid, Kv data) {
		try {
			SqlPara sqlPara = Db.getSqlPara("article.updateColumnsById", Kv.by("data", data).set("id", aid));
			int num = Db.update(sqlPara);
			if (num > 0) {
				return YsKit.ok().msg("更新成功");
			} else {
				return YsKit.fail().msg("更新失败");
			}
		} catch (Exception e) {
			LogKit.error("ArticleDao.updateColumnsById():" + e.getLocalizedMessage());
			return YsKit.sqlError();
		}
	}

	/**
	 * 查询文章
	 * 
	 * @param pageNumber
	 * @param pageSize
	 * @return
	 */
	public Page<Record> page(int pageNumber, int pageSize) {
		return this.pageByCond(pageNumber, pageSize, null);
	}

	/**
	 * 查询文章，搜索更新时间
	 * 
	 * @param pageNumber
	 * @param pageSize
	 * @param beginDate
	 *            开始日期
	 * @param endDate
	 *            结束日期
	 * @return
	 */
	public Page<Record> page(int pageNumber, int pageSize, String beginDate, String endDate) {
		return this.pageByCond(pageNumber, pageSize, Kv.by("update_time >", beginDate).set("update_time <", endDate));
	}

	/**
	 * 查询置顶文章
	 * 
	 * @param pageNumber
	 * @param pageSize
	 * @param isTop
	 *            是否置顶
	 * @return
	 */
	public Page<Record> page(int pageNumber, int pageSize, boolean isTop) {
		return this.pageByCond(pageNumber, pageSize, Kv.by("is_top =", isTop ? Article.IS_TOP_ON : Article.IS_TOP_OFF));
	}

	/**
	 * 多条件进行查找
	 * 
	 * @param pageNumber
	 * @param pageSize
	 * @param cond
	 *            查询条件
	 * @return data:Page<Record>
	 */
	private Page<Record> pageByCond(int pageNumber, int pageSize, Kv cond) {
		try {
			SqlPara sqlPara = Db.getSqlPara("article.pageByCond", Kv.by("cond", cond));
			return Db.paginate(pageNumber, pageSize, sqlPara);
		} catch (Exception e) {
			LogKit.error("ArticleDao.pageByCond():" + e.getLocalizedMessage());
			return new Page<Record>();
		}
	}

	/**
	 * 查询文章的数量
	 * 
	 * @return
	 */
	public long count() {
		return this.countByCond(null);
	}

	/**
	 * 计数，某个时间之后的文章数量
	 * 
	 * @param beginDate
	 *            统计的开始时间
	 * @return
	 */
	public long count(String beginDate) {
		return this.countByCond(Kv.by("update_time >", beginDate));
	}

	/**
	 * 计数，置顶的文章数
	 * 
	 * @param isTop
	 *            是否置顶
	 * @return
	 */
	public long count(boolean isTop) {
		return this.countByCond(Kv.by("is_top =", isTop ? Article.IS_TOP_ON : Article.IS_TOP_OFF));
	}

	/**
	 * 多条件统计文章数量
	 * 
	 * @param cond
	 * @return
	 */
	private long countByCond(Kv cond) {
		try {
			SqlPara sqlPara = Db.getSqlPara("article.countByCond", Kv.by("cond", cond));
			return Db.queryLong(sqlPara.getSql());
		} catch (Exception e) {
			LogKit.error("ArticleDao.countByCond():" + e.getLocalizedMessage());
			return 0;
		}
	}
}
